package gitlet;

import javax.swing.JMenu;
import javax.swing.JPanel;
import javax.swing.JMenuItem;
import javax.swing.JOptionPane;
import java.io.File;
import java.util.List;

/**
 * @author 陈恒康
 * @Description BranchMenu类是JMenu的子类，用于创建一个包含多个菜单项的菜单。这个菜单包含"New"、"Merge"、"Checkout"和"Remove"四个菜单项。当点击"New"菜单项时，会弹出一个对话框让用户输入新的分支名，然后在仓库中创建一个新的分支，并更新分支列表面板。
 * @date 2023/12/05
 */
public class BranchMenu extends JMenu {

    /**
     * @param branchPanel 分支列表面板
     * @param repository  与菜单项相关联的仓库对象
     * @Description 构造一个新的BranchMenu对象。该对象包含"New"、"Merge"、"Checkout"和"Remove"四个菜单项。当点击"New"菜单项时，会弹出一个对话框让用户输入新的分支名，然后在仓库中创建一个新的分支，并更新分支列表面板。
     * @author 陈恒康
     * @date 2023/12/05
     */
    public BranchMenu(JPanel branchPanel, Repository repository) {
        super("Branch");
        JMenuItem addBranch = new JMenuItem("New");
        JMenuItem mergeBranch = new JMenuItem("Merge");
        JMenuItem checkout = new JMenuItem("Checkout");
        JMenuItem remove = new JMenuItem("Remove");
        File BRANCH_HEADS_DIR = repository.getBRANCH_HEADS_DIR();
        this.add(addBranch);
        this.add(mergeBranch);
        this.add(checkout);
        this.add(remove);
        addBranch.addActionListener(e -> {
            String input = JOptionPane.showInputDialog("请输入新的分支名");
            if (input != null)
                repository.branch(input);
            String[] branches = BRANCH_HEADS_DIR.list();
            BranchListPanel branchListPanel = new BranchListPanel(repository, branches);
            branchPanel.removeAll();
            branchPanel.add(branchListPanel);
            branchPanel.revalidate();
            branchPanel.repaint();
        });
        /**
         * @Description 为mergeBranch菜单项添加了一个动作监听器。当用户点击mergeBranch菜单项时，会弹出一个对话框让用户选择一个分支，然后在仓库中合并选中的分支。
         * @author 陈恒康
         * @date 2023/12
         */
        mergeBranch.addActionListener(e -> {
            String[] branches = BRANCH_HEADS_DIR.list();
            String input = (String) JOptionPane.showInputDialog(new JPanel(), "请选择分支", "选择分支", 1, null, branches, branches[0]);
            if (input != null)
                repository.merge(input, 1);
        });
        /**
         * @Description 为checkout菜单项添加了一个动作监听器。当用户点击checkout菜单项时，会弹出一个对话框让用户选择一个模式，包括"切换分支"、"恢复指定文件"和"恢复指定ID版本文件"。根据用户选择的模式，执行相应的操作。
         * @author 陈恒康
         * @date 2023/12
         */
        checkout.addActionListener(e -> {
            String[] mods = {"切换分支", "恢复指定文件", "恢复指定ID版本文件"};
            String mod = (String) JOptionPane.showInputDialog(new JPanel(), "请选择模式", "选择模式", 1, null, mods, mods[0]);
            if (mod == null)
                return;
            switch (mod) {
                case "切换分支" -> {
                    String[] branches = BRANCH_HEADS_DIR.list();
                    String input = (String) JOptionPane.showInputDialog(new JPanel(), "请选择分支", "选择分支", 1, null, branches, branches[0]);
                    if (input != null)
                        repository.checkout(input);
                    branches = BRANCH_HEADS_DIR.list();
                    BranchListPanel branchListPanel = new BranchListPanel(repository, branches);
                    branchPanel.removeAll();
                    branchPanel.add(branchListPanel);
                    branchPanel.revalidate();
                    branchPanel.repaint();
                }
                case "恢复指定文件" -> {
                    String input = JOptionPane.showInputDialog("请输入文件名");
                    if (input != null) {
                        String[] cmd = {"cmd", "--", input};
                        repository.checkout(cmd);
                    }
                }
                case "恢复指定ID版本文件" -> {
                    List<String> idAndMessage = repository.getAllCommitMsgId();
                    if (idAndMessage.isEmpty()) return;
                    String input = (String) JOptionPane.showInputDialog(new JPanel(), "请选择", "选择提交", 1, null, idAndMessage.toArray(new String[]{}), idAndMessage.toArray(new String[]{})[0]);
                    if (input == null) return;
                    String filename = JOptionPane.showInputDialog("请输入文件名");
                    if (filename == null) return;
                    int lastColonIndex = input.lastIndexOf(":");
                    String result = input.substring(lastColonIndex + 2);
                    String[] cmd = {"checkout", result, "--", filename};
                    repository.checkout(cmd);
                }
            }
        });
        /**
         * @Description 为remove菜单项添加了一个动作监听器。当用户点击remove菜单项时，会弹出一个对话框让用户选择一个分支，然后在仓库中移除选中的分支，并更新分支列表面板。
         * @author 陈恒康
         * @date 2023/12
         */
        remove.addActionListener(e -> {
            String[] branches = BRANCH_HEADS_DIR.list();
            String input = (String) JOptionPane.showInputDialog(new JPanel(), "请选择分支", "选择分支", 1, null, branches, branches[0]);
            if (input != null)
                repository.removeBranch(input);

            String[] newBranches = BRANCH_HEADS_DIR.list();
            BranchListPanel branchListPanel = new BranchListPanel(repository, newBranches);
            branchPanel.removeAll();
            branchPanel.add(branchListPanel);
            branchPanel.revalidate();
            branchPanel.repaint();
        });
    }
}